home *** CD-ROM | disk | FTP | other *** search
- unit CaseUtil;
-
- interface
-
- type
- DelimType =
- record
- thousands,
- decimal,
- date,
- time : array[0..1] of Char;
- end;
-
- CurrType = (leads, { symbol precedes value }
- trails, { value precedes symbol }
- leads_, { symbol, space, value }
- _trails, { value, space, symbol }
- replace); { replaced }
-
- CountryType =
- record
- DateFormat : Word; { 0: USA, 1: Europe, 2: Japan }
- CurrSymbol : array[0..4] of Char;
- Delimiter : DelimType; { Separators }
- CurrFormat : CurrType; { Way currency is formatted }
- CurrDigits : Byte; { Digits in currency }
- Clock24hrs : Boolean; { True if 24-hour clock }
- CaseMapCall : procedure; { Lookup table for ASCII > $80 }
- DataListSep : array[0..1] of Char;
- CID : word;
- Reserved : array[0..7] of Char;
- end;
-
- CountryInfo =
- record
- case InfoID: byte of
- 1: (IDSize : word;
- CountryID : word;
- CodePage : word;
- TheInfo : CountryType);
- 2: (UpCaseTable: pointer);
- end;
-
- var
- CountryOk : Boolean; { Could determine country code flag }
- CountryRec : CountryInfo;
-
- function Upcase(c : Char) : Char;
- function LoCase(c : Char) : Char;
- function UpperStr(s : string) : string;
- function LowerStr(s : string) : string;
- procedure UpCaseStr(var s : String);
- procedure LoCaseStr(var s : String);
-
- implementation
-
- {$R-,S-,V- }
- var
- LoTable : array[0..127] of byte;
- CRP, LTP : pointer;
-
- { Convert a character to upper case }
- function Upcase; Assembler; asm
- mov al, c
- cmp al, 'a'
- jb @2
- cmp al, 'z'
- ja @1
- sub al, ' '
- jmp @2
- @1: cmp al, 80h
- jb @2
- sub al, 7eh
- push ds
- lds bx,CountryRec.UpCaseTable
- xlat
- pop ds
- @2:
- end; { UpCase }
-
- { Convert a character to lower case }
- function LoCase; Assembler; asm
- mov al, c
- cmp al, 'A'
- jb @2
- cmp al, 'Z'
- ja @1
- or al, ' '
- jmp @2
- @1: cmp al, 80h
- jb @2
- sub al, 80h
- mov bx,offset LoTable
- xlat
- @2:
- end; { LoCase }
-
- { Convert a string to uppercase }
- procedure UpCaseStr; Assembler; asm
- cld
- les di, s
- xor ax, ax
- mov al, es:[di]
- stosb
- xchg ax, cx
- jcxz @4
- push ds
- lds bx,CountryRec.UpCaseTable
- @1: mov al, es:[di]
- cmp al, 'a'
- jb @3
- cmp al, 'z'
- ja @2
- sub al, ' '
- jmp @3
- @2: cmp al, 80h
- jb @3
- sub al, 7eh
- xlat
- @3: stosb
- loop @1
- pop ds
- @4:
- end; { UpCaseStr }
-
- { Convert a string to lower case }
- procedure LoCaseStr; Assembler; asm
- cld
- les di, s
- xor ax, ax
- mov al, es:[di]
- stosb
- xchg ax, cx
- jcxz @4
- @1: mov al, es:[di]
- cmp al, 'A'
- jb @3
- cmp al, 'Z'
- ja @2
- or al, ' '
- jmp @3
- @2: cmp al, 80h
- jb @3
- sub al, 80h
- mov bx, offset LoTable
- xlat
- @3: stosb
- loop @1
- @4:
- end; { LoCaseStr }
-
- function UpperStr(s : string) : string;
- begin UpCaseStr(s); UpperStr:=s end;
- function LowerStr(s : string) : string;
- begin LoCaseStr(s); LowerStr:=s end;
-
- begin { init DoCase unit }
- CRP := @CountryRec;
- LTP := @LoTable;
- asm
-
- { Exit if Dos version < 3.0 }
- mov ah, 30h
- int 21h
- cmp al, 3
- jb @1
-
- { Call Dos 'Get country dependent information' function }
- mov ax, 6501h
- les di, CRP
- mov bx,-1
- mov dx,bx
- mov cx,41
- int 21h
- jc @1
-
- { Call Dos 'Get country dependent information' function }
- mov ax, 6502h
- mov bx, CountryRec.CodePage
- mov dx, CountryRec.CountryID
- mov CountryRec.TheInfo.CID, dx
- mov cx, 5
- int 21h
- jc @1
-
- { Build LoCase table }
- les di, LTP
- mov cx, 80h
- mov ax, cx
- cld
- @3:
- stosb
- inc ax
- loop @3
- mov di, offset LoTable - 80h
- mov cx, 80h
- mov dx, cx
- push ds
- lds bx, CountryRec.UpCaseTable
- sub bx, 7eh
- @4:
- mov ax, dx
- xlat
- cmp ax, 80h
- jl @5
- cmp dx, ax
- je @5
- xchg bx, ax
- mov es:[bx+di], dl
- xchg bx, ax
- @5:
- inc dx
- loop @4
- pop ds
- mov [CountryOk], True
- jmp @2
- @1: mov [CountryOk], False
- @2:
- end;
- end.